﻿using System;
using System.Diagnostics;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using ExampleImplementation;
using LoRel;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace CoreTest
{
    //[TestClass]
    //public class UnitTest1 {

    //    private bool has_ibm = false;


    //    private Schema GetSchema() {
    //        Expression pos_trader = CORE.Exp.Register("Pos.Trader", PosSymbol);
    //        Expression pos_qty = CORE.Exp.Register("Pos.Qty", PosSymbol);
    //        Expression pos_symbol = CORE.Exp.Register("Pos.Symbol", PosSymbol);

    //        Schema schema = new Schema(
    //            new[] { pos_symbol, pos_trader, pos_qty },
    //            new[] { pos_symbol, pos_trader });
    //        return schema;
    //    }

    //    [TestMethod]
    //    public void SimpleNotification() {
    //        Schema schema = GetSchema();
    //        NotifyDict<Pos> dictionary = new NotifyDict<Pos>( schema );
    //        Notify notify = new Notify(dictionary);

    //        Key query_key = new Key( schema, "IBM" );
    //        notify.Register( schema, query_key, RespondToIBM);

    //        dictionary.EnqueueAdd(new Pos("IBM1", "Jim", 100));
    //        Assert.IsFalse(has_ibm, "Notification received on non-registered.");
    //        dictionary.EnqueueAdd(new Pos("IBM", "Jim", 100));

    //        Assert.IsTrue(has_ibm, "Failure to recieve notification");

    //        // breakdown
    //        Assert.IsTrue(CORE.Exp.DeRegister("Pos.Symbol", PosSymbol), "Failed to deregister");
    //        has_ibm = false;
    //    }
        
    //    [TestMethod]
    //    public void ThrowsOnConstraintViolation()
    //    {
    //        Schema schema = GetSchema();
    //        NotifyDict<Pos> dictionary = new NotifyDict<Pos>(schema);
    //        Notify notify = new Notify(dictionary);


    //        Key query_key = new Key(schema, "IBM");
    //        notify.Register(schema, query_key, RespondToIBM);

    //        dictionary.EnqueueAdd( new Pos( "IBM", "Jim", 100) );
    //        try {
    //            dictionary.EnqueueAdd( new Pos( "IBM", "Jim", 1000 ) );
    //        } catch( Exception ex ) {
    //            Console.WriteLine( "Received Exception: " + ex.ToString() );
    //            return;
    //        }finally {
    //            // breakdown
    //            Assert.IsTrue(has_ibm, "Failure to recieve notification");
    //            Assert.IsTrue(CORE.Exp.DeRegister("Pos.Symbol", PosSymbol), "Failed to deregister");
    //            has_ibm = false;
    //        }
    //        throw new Exception("Failed to throw constraint violation");
    //    }


    //    [TestMethod]
    //    public void AllowsUpdate() {
    //        throw new Exception("Test broken");


    //        Schema schema = GetSchema();
    //        NotifyDict<Pos> dictionary = new NotifyDict<Pos>(schema);
    //        Notify notify = new Notify(dictionary);

    //        Key query_key = new Key(schema, "IBM");
    //        notify.Register(schema, query_key, RespondToIBM);

    //        Pos current_pos = null;
    //        //notify.Register( pos_symbol, new SymbolKey( "IBM" ), 
    //        //    delegate( ChangeNotifyItem item ) {
    //        //        Pos p = (Pos)item.NewValue;
    //        //        Assert.IsTrue(p.Symbol == "IBM", "Notification recieved for non IBM");
    //        //        Console.WriteLine(p);
    //        //        has_ibm = true;
    //        //        current_pos = p;
    //        //    }
    //        //    );


    //        dictionary.EnqueueAdd( new Pos( "IBM", "Jim", 100 ) );
    //        has_ibm = false;
    //        try
    //        {
    //            dictionary.EnqueueUpdate( new Pos( "IBM", "Jim", 1000 ), new Pos( "IBM", "Jim", 100 ) );
    //        } finally {
    //            // breakdown
    //            Assert.IsTrue(has_ibm, "Failure to recieve notification");
    //            Assert.IsTrue(current_pos.Qty == 1000, "Failure to recieve notification");

    //            Assert.IsTrue( CORE.Exp.DeRegister( "Pos.Symbol", PosSymbol ), "Failed to deregister" );
    //            has_ibm = false;
    //        }
    //    }




    //    private void RespondToIBM( ChangeNotifyItem item ) {
    //        Pos p = ( Pos ) item.NewValue;
    //        Assert.IsTrue( p.Symbol == "IBM", "Notification recieved for non IBM" );
    //        Console.WriteLine( p );
    //        has_ibm = true;
    //    }

    //    //private Key EvalMDSymbol( object input ) {
    //    //    MD md = ( MD ) input;
    //    //    return new SymbolKey( md.Symbol );
    //    //}

    //    private String PosSymbol( object input ) { 
    //        Pos pos = ( Pos ) input;
    //        return pos.Symbol;
    //    }
    //}
}
